home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 1 / Gekikoh Dennoh Club Vol. 1 (Japan).7z / Gekikoh Dennoh Club Vol. 1 (Japan) (Track 1).bin / kowin / archive / apl / tvv132.lzh / textview.c < prev    next >
C/C++ Source or Header  |  1995-12-22  |  7KB  |  335 lines

  1. /*
  2.     MicroView.win Copyright 1995 小笠原博之
  3.     oga@dgw.yz.yamagata-u.ac.jp
  4. */
  5.  
  6. #include    "microview.h"
  7.  
  8. #define    Ctrl(a)    ((a)&0x1f)
  9.  
  10. #define        EVENTA    (EventOpenON    \
  11.             |EventRedrawON    \
  12.             |EventCloseON    \
  13.             |EventIconifyON    \
  14.             |EventResizeON    \
  15.             |EventKeyON    \
  16.             |EventUserON    \
  17.             |EventMouseSwitchON    )
  18. #define        EVENTB    (EventOpenON    \
  19.             |EventRedrawON    \
  20.             |EventCloseON    \
  21.             |EventMouseSwitchON    )
  22.  
  23. int    GlobalCount= 0;
  24.  
  25. static void
  26. SendString( prog, str, info )
  27. char    *prog, *str;
  28. EventInfo    *info;
  29. {
  30.     info->option= EventUser;
  31.     info->ComData= UserString;
  32.     info->ComBuffer= str;
  33.     PidSendEvent( prog, info, TRUE );
  34. }
  35.  
  36. static void
  37. ExecProgram( prog, opt, str )
  38. char    *prog, *opt, *str;
  39. {
  40.     WindowID    dp= DialogMessageOpen( "ロード中",
  41.                         AttrDefault|AttrHighLight );
  42.     char    buf[128];
  43.     s_strcpy( buf, opt );
  44.     s_strcat( buf, " " );
  45.     s_strcat( buf, str );
  46.     WindowLoadExec( prog, buf, 0, 0 );
  47.     WindowClose( dp );
  48. }
  49.  
  50. static void
  51. DrawCurpos( i, rv, bp )
  52. T_BUFP    *bp;
  53. {
  54.     if( i >= 0 ){
  55.         unsigned char    *p= bp->lp[i];
  56.         int    attr, font, xoff, opt;
  57.         if( !p[3] )
  58.             return;
  59.         font= *p++;
  60.         if( font >= 8 ){
  61.             DrawBuf    dbuf[1];
  62.             opt= *p++-1;
  63.             attr= *p++;
  64.             xoff= opt&0xfc;
  65.             if( xoff == 248 ){
  66.                 xoff= (HS_WindowGetViewSizeX(bp->bwp)-
  67.                         strlen(p)*font/2)/2;
  68.             }
  69.             DrawSetSymbol( dbuf, xoff+5, i*bp->font_z + (opt?2:0),
  70.                         p, rv ? attr^AttrReverse :
  71.                         attr, font );
  72.             WindowDraw( bp->bwp, dbuf, 1 );
  73.         }
  74.     }
  75. }
  76.  
  77. static
  78. EventExecB( wp, info )
  79. WindowID    wp;
  80. EventInfo    *info;
  81. {
  82.     DrawBuf    dbuf[ 120+1 ];
  83.     T_BUFP    *bp= HS_WindowGetClientPointer(wp);
  84.  
  85.     switch( info->option ){
  86.     case EventOpen:
  87.         WindowSetEventAttr( wp, EVENTB );
  88.         return    TRUE;
  89.  
  90.     case EventRedraw: {
  91.         int    dc= 1,
  92.             i= info->y;
  93.         unsigned int    y, yy;
  94.         unsigned char    **ptr;
  95.         ShadowInit();
  96.         DrawSetClear( dbuf, bp->backattr );
  97.         if( i/= bp->font_z )
  98.             i--;
  99.         ptr= bp->lp+i;
  100.         y= i* bp->font_z;
  101.         yy= info->v+ y+ bp->font_z+ bp->font_z;
  102.         for(; y< yy && i < bp->line ; y+= bp->font_z, i++ ){
  103.             unsigned char    *p= *ptr++;
  104.             int    attr, font, xoff, opt;
  105.             if( !p[3] )
  106.                 continue;
  107.             font= *p++;
  108.             opt= *p++-1;
  109.             attr= *p++;
  110.             if( i == bp->curpos )
  111.                 attr^= AttrReverse;
  112.             if( font < 48 ){
  113.                 xoff= opt&0xfc;
  114.                 if( xoff == 248 ){
  115.                     xoff= (HS_WindowGetViewSizeX(wp)-
  116.                             strlen(p)*font/2)/2;
  117.                 }
  118.                 switch( opt&3 ){
  119.                 case 0:
  120.                     DrawSetSymbol( dbuf+dc++, xoff, y,
  121.                             p, attr, font );
  122.                     break;
  123.                 case 1:
  124.                     {
  125.                     Sheet    *sp;
  126.                 _shadow:
  127.                     sp= (Sheet*)SheetShadow( p,attr,font);
  128.                     if( !sp ){
  129.                         WindowDraw( wp, dbuf, dc );
  130.                         dc= 0;
  131.                         goto    _shadow;
  132.                     }
  133.                     DrawSetPut( dbuf+dc++, xoff, y, sp );
  134.                     }
  135.                     break;
  136.                 case 2:
  137.                 case 3:
  138.                     if( font >= 8 )
  139.                         DrawSetSymbol( dbuf+dc++,
  140.                             xoff+5, y+2,
  141.                             p, attr, font );
  142.                     DrawSetLine( dbuf+dc++, xoff+3, y,
  143.                         xoff+strlen(p)*font/2+8,
  144.                         y+font+4,
  145.                         opt&1, OptionShadow );
  146.                     break;
  147.                 }
  148.             }else{
  149.                 switch( font ){
  150.                 case 50:
  151.                 case 51:
  152.                     attr += attr;
  153.                     opt += opt;
  154.                 case 48:
  155.                 case 49:
  156.                     DrawSetLine( dbuf+dc++, attr, y,
  157.                             opt, y+2,
  158.                             font&1, OptionShadow );
  159.                     break;
  160.                 }
  161.             }
  162.         }
  163.         WindowDraw( wp, dbuf, dc );
  164.         return    TRUE;
  165.         }
  166.  
  167.     case EventClose:
  168.         WindowClose( wp );
  169.         return    TRUE;
  170.     case EventMouseSwitch:
  171.         if( info->LeftON ){
  172.             int    i= info->y/bp->font_z;
  173.             if( i >= 0 && i < bp->line ){
  174.                 char    *p;
  175.             _RRR:
  176.                 for( p= bp->lp[i]+3 ; *p++ ;);
  177.                 if( !*p ){
  178.                     i--;
  179.                     goto    _RRR;
  180.                 }
  181.                 if( *p >= 'A' && *p <= 'z' ){
  182.                     DrawCurpos( bp->curpos, FALSE, bp );
  183.                     DrawCurpos( bp->curpos= i, TRUE, bp );
  184.                 }
  185. /***/
  186.     switch( *p ){
  187.     case 'E': {
  188.             WindowID    dp= DialogMessageOpen(
  189.                         "ロード中",
  190.                         AttrDefault|AttrHighLight );
  191.             char    exec[80];
  192.             p= p_strcpych( ' ', exec, p+1 );
  193.             WindowLoadExec( exec, p, 0, 0 );
  194.             WindowClose( dp );
  195.         }
  196.         break;
  197.     case 'V': {
  198.             WindowID    dp= DialogMessageOpen(
  199.                         "ロード中",
  200.                         AttrDefault|AttrHighLight );
  201.             BPopen( p+1 );
  202.             WindowClose( dp );
  203.         }
  204.         break;
  205.     case 'K': {
  206.             int    pid= 0;
  207.             if( !p[1] )
  208.                 WindowSendSignal( 0, SignalKill, NULL );
  209.             else for(; pid= PidSearch( p+1, pid+1 );)
  210.                 WindowSendSignal( pid, SignalKill, NULL );
  211.         }
  212.         break;
  213.     case 'U': {
  214.             char    exec[80];
  215.             p= p_strcpych( ',', exec, p+1 );
  216.             SendString( exec, p+1, info );
  217.         }
  218.         break;
  219.     case 'p': {
  220.             char    exec[80], opt[80];
  221.             p= p_strcpych( ',', exec, p+1 );
  222.             p= p_strcpych( ',', opt, p+1 );
  223.             if( PidSearch( exec, 0 ) ){
  224.                 SendString( exec, p+1, info );
  225.             }else
  226.                 ExecProgram( exec, opt, p+1 );
  227.         }
  228.         break;
  229.     case 'C':
  230.         info->option= EventClose;
  231.         WindowSendEvent( bp->awp, info );
  232.         break;
  233.     }
  234. /***/
  235.             }
  236.         }
  237.         return    TRUE;
  238.     }
  239.     return    FALSE;
  240. }
  241.  
  242. static
  243. EventExecA( wp, info )
  244. WindowID    wp;
  245. EventInfo    *info;
  246. {
  247.     DrawBuf    dbuf[10];
  248.     T_BUFP    *bp= HS_WindowGetClientPointer(wp);
  249.  
  250.     switch( info->option ){
  251.     case EventOpen:
  252.         WindowSetEventAttr( wp, EVENTA );
  253.         return    TRUE;
  254.  
  255.     case EventRedraw: {
  256.             int    x= HS_WindowGetViewSizeX(wp),
  257.                 y= HS_WindowGetViewSizeY(wp);
  258.             DrawSetLine( dbuf, x-10, y-10, x, y, ColorGray,
  259.                                 OptionFill );
  260.             WindowDraw( wp, dbuf, 1 );
  261.             WindowRedraw( bp->bwp );
  262.         }
  263.         return    TRUE;
  264.  
  265.     case EventClose:
  266.         WindowClose( wp );
  267.         if( bp->fbuf )
  268.             MFREE( bp->fbuf );
  269.         if( bp->lp )
  270.             MFREE( bp->lp );
  271.         free( bp );
  272.         if( !--GlobalCount )
  273.             WindowConnectionClose();
  274.         return    TRUE;
  275.  
  276.     case EventMouseSwitch:
  277.         if( info->LeftON ){
  278.             if( info->x >= HS_WindowGetViewSizeX( wp )-10
  279.                 && info->y >= HS_WindowGetViewSizeY( wp )-10 )
  280.                 WindowResizeOperation( wp, info );
  281.             else
  282.                 WindowSendEvent( bp->bwp, info );
  283.             return    TRUE;
  284.         }
  285.         break;
  286.     case EventResize:
  287.         WindowResize( bp->bwp, 0, 0, info->h, info->v );
  288.         WindowResize( wp, info->x, info->y, info->h, info->v );
  289.         return    TRUE;
  290.  
  291.     case EventIconify:
  292.         IconEnt( wp, bp->title, AttrDefault, 12 );
  293.         return    TRUE;
  294.  
  295.     case EventUser:
  296.         switch( info->ComData ){
  297.         case UserStrings: {
  298.                 unsigned char    **p= info->ComBuffer;
  299.                 for(; *p ; BPopen( *p++ ) );
  300.             }
  301.             break;
  302.         case UserPaste:
  303.         case UserString:
  304.             BPopen( info->ComBuffer );
  305.         }
  306.         info->ComData= -1;
  307.         return    TRUE;
  308.     case EventKey:
  309.         KeyExec( info, bp );
  310.         return  TRUE;
  311.     }
  312.     return    FALSE;
  313. }
  314.  
  315. void
  316. MV_Open( x, y, h, v, bp )
  317. T_BUFP    *bp;
  318. {
  319.     bp->awp= WindowTitleOpen( x, y, h, v, NULL, bp->title,
  320.                     Icon|Resize|Close|Push, EventExecA );
  321.     bp->bwp= WindowScrollOpen( 0, 0,
  322.                     HS_WindowGetViewSizeX(bp->awp),
  323.                     HS_WindowGetViewSizeY(bp->awp),
  324.                         bp->awp,
  325.                         bp->maxcol* bp->font_x,
  326.                         bp->line*bp->font_z,
  327.                         DirectionY|DirectionX,
  328.                         16, bp->font_z*2, EventExecB );
  329.     HS_WindowGetClientPointer(bp->awp)=
  330.     HS_WindowGetClientPointer(bp->bwp)= bp;
  331.     WindowRedraw( bp->awp );
  332.     GlobalCount++;
  333. }
  334.  
  335.